关于node | 您所在的位置:网站首页 › javascript redis › 关于node |
按现在大多数在node上使用redis去查询Redis里所有键,都是使用的keys这个命令 redisClient.keys("key",callback)但是,redis官方其实不推荐使用keys这个命令来获取所有的键值,官网是这样描述的: keys针对大型数据库执行时,可能会破坏性能,此命令只用于调试和特殊操作。其实不难理解,redis是单线程处理用户的命令,而keys命令会一次遍历所有的key,在执行过程中是无法执行其他命令的。这就导致key比较多的时候key命令执行时间会比较的长,从而堵塞redis。 官方推荐了sets和scan两个命令去执行。因为这次存储全部使用的String类型存储,sets方法只能用于set类型,所以只能用scan。 scan会分次进行遍历,不会堵塞线程,提供了一个count参数来控制每次遍历的集合数,可以理解为是一种渐进式的keys。 然而scan的这个方法基本没看到有人使用,node_redis的官方文档永远就讲get、set这两个api,找不到相关参数。于是乎在外网找到了scan的用法 redisClient.scan(cursor,"MATCH","pattern",'COUNT',"10000",callback) ursor - 游标。pattern - 匹配的模式。count - 指定每次遍历多少个集合。 可以简单理解为每次遍历多少个元素根据测试,推荐 Count大小为 1W这个count值比较的重要,这个值如果过于小了反而会导致scan执行特别慢,太大了可能又会导致redis堵塞时间长,和key没啥区别了,所以这个值得根据数据库中的数据数量来设置,不过有人测试过scan count值理想的大小为10000。 scan方法考虑到这一点,所以在查询的结果会返回一个key,这个key值是一个数组,数组[1]是查询到全部键,数组[0]就是查询返回的游标值。如果key等于0的话就等于查询结束,如果还未结束,这个key做为游标就表示hash遍历的最后一个值,我们需要将这个值重新传回给scan作为cursor继续进行查询。 首先我们需要定一个变量cursor设置为0 const cursor = 0然后设置好scan方法和回调 redisClient.scan(cursor,"MATCH",type,'COUNT',"10000",(err,key)=>{ if(err){ throw err } })在回调中将key赋值给变量cursor,并判断cursor是否为0 function scan(res){ redisClient.scan(cursor,"MATCH","user_info:username:*",'COUNT',"10000",(err,key)=>{ if(err){ throw err } cursor = key[0] if(cursor === '0'){ } }) }如果游标为零,将结果存储起来,如果不为0就返回函数方法。 function scan(res){ redisClient.scan(cursor,"MATCH","user_info:username:*",'COUNT',"10000",(err,key)=>{ if(err){ throw err } cursor = key[0] if(cursor === '0'){ keyarr.push(...key[1]) }else{ if(key[1].length !== 0){ keyarr.push(...key[1]) } return scan(res) } }) }这样子就可以将数据库中的所有键值遍历并保存下来了。 |
CopyRight 2018-2019 实验室设备网 版权所有 |